/*
 * bsp_spi.c
 *
 *  Created on: 2025 Jul 4
 *      Author: SFLYs
 */
#include "bsp_spi.h"

extern __interrupt void spiISR(void);

void GPIO_Config(uint32_t pin, GPIO_PinMux mux, GPIO_Direction dir, GPIO_PinType type,
    GPIO_QualificationMode qual)
{
    GPIO_setPinConfig(mux);
    GPIO_setDirectionMode(pin, dir);
    GPIO_setPadConfig(pin, type);
    /* output mode no need config qualification */
    if (dir == GPIO_DIR_MODE_IN)
        GPIO_setQualificationMode(pin, qual);
}


void Bsp_SPI_CS_Init(void)
{

    GPIO_MuxConfig(GPIO_SPI_CS, GPIO_CONFIG_GPIO_SPI_CS, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP, GPIO_QUAL_3SAMPLE);
    Interrupt_register(INT_XINT1, &spiISR);
    Interrupt_enable(INT_XINT1);
    GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_FALLING_EDGE);
    GPIO_setInterruptPin(GPIO_SPI_CS, GPIO_INT_XINT1);
    GPIO_enableInterrupt(GPIO_INT_XINT1);
}



void Bsp_SPI_Init(void)
{

    Bsp_SPI_CS_Init();

    //开启时钟
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIB);
    //配置中断
//    Interrupt_register(INT_SPIB_S, &spiRxISR);
//    Interrupt_enable(INT_SPIB_S);
    SPI_disableInterrupt((u32)&SpibRegs.SLAVE, SPI_INT_MASK_ALL);

    //SPI接口GPIO定义
    GPIO_Config(GPIO_SPI_CLK, GPIO_CONFIG_SPI_CLK, GPIO_DIR_MODE_OUT, GPIO_PIN_TYPE_STD, GPIO_QUAL_ASYNC);
    GPIO_Config(GPIO_SPI_STE, GPIO_CONFIG_GPIO_SPI_STE, GPIO_DIR_MODE_IN, GPIO_PIN_TYPE_PULLUP, GPIO_QUAL_ASYNC);
    GPIO_Config(GPIO_SPI_ESTOP, GPIO_CONFIG_GPIO_SPI_ESTOP, GPIO_DIR_MODE_IN, GPIO_PIN_TYPE_PULLUP, GPIO_QUAL_ASYNC);
    GPIO_Config(GPIO_SPI_MOSI, GPIO_CONFIG_GPIO_SPI_MOSI, GPIO_DIR_MODE_OUT, GPIO_PIN_TYPE_STD, GPIO_QUAL_ASYNC);
    GPIO_Config(GPIO_SPI_MISO, GPIO_CONFIG_GPIO_SPI_MISO, GPIO_DIR_MODE_IN, GPIO_PIN_TYPE_STD, GPIO_QUAL_ASYNC);

    SPI_disableModule((u32)&SpibRegs.SLAVE);

   // SPI_disableModule(SPI_BASE);
    SPI_setConfig(SPI_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0, \
            SPI_MODE_PERIPHERAL, SPI_FREQ, SPI_DATA_BITS_16);
    SPI_setFIFOInterruptLevel((u32)&SpibRegs.SLAVE, SPI_FIFO_TX1, SPI_FIFO_RX1);
//    SPI_setFIFOInterruptLevel();
    SpibRegs.SLAVE.RXFTL   = 0;
   // SPI_enableInterrupt((u32)&SpibRegs.MASTER,SPI_INT_MASK_RXF);
    SPI_enableModule((u32)&SpibRegs.SLAVE);

}




void Bsp_SPI_SendByte(uint16_t data)
{
    while(SPI_getTxFIFOStatus((u32)&SpibRegs.SLAVE) != SPI_FIFO_TXEMPTY);
    SPI_writeDataBlockingFIFO((u32)&SpibRegs.SLAVE, data);
}




